/**
 * 面试题44：数字序列中某一位的数字
 */
public class Offer_44 {
    /**
     * 精选题解
     */
    public int findNthDigit(int n) {
        // 每个数字的位数，比如 10 的位数是 2
        int digit = 1;
        // digit 位数的起始数字，如 1，10，100 等
        long start = 1;
        // digit 位数的数量
        // count = 9 * start * digit
        long count = 9;

        while (n > count) {
            n -= count;
            digit += 1;
            start *= 10;
            count = digit * start * 9;
        }
        // 所求数位在从数字 start 开始的第 [(n - 1) / digit] 个数字中（start 为第 0 个数字）
        long num = start + (n - 1) / digit;
        // 所求数位为数字 num 的 第 (n - 1) % digit 个数位（数字的首个数位为第 0 位）
        return Long.toString(num).charAt((n - 1) % digit) - '0';
    }
}
